package net.tksl.crm.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import net.tksl.crm.controller.view.bean.MenuItemBean;
import net.tksl.crm.controller.view.bean.ModuloPanelBean;
import net.tksl.crm.controller.view.bean.SubMenuBean;
import net.tksl.crm.controller.view.bean.UsuarioSistemaBean;
import net.tksl.crm.dao.UsuarioDao;
import net.tksl.crm.dao.bd.ModuloBD;
import net.tksl.crm.dao.bd.PaginaBD;
import net.tksl.crm.dao.bd.PermisoBD;
import net.tksl.crm.dao.bd.UsuarioSistemaBD;
import net.tksl.crm.service.UsuarioAccesoService;
import net.tksl.crm.util.Constantes;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service("usuarioAccesoServiceImpl")
public class UsuarioAccesoServiceImpl implements UsuarioAccesoService{

	static Logger logger = Logger.getLogger(UsuarioAccesoServiceImpl.class);
	
	@Autowired
	@Qualifier("usuarioDaoImpl")
	private UsuarioDao usuarioDao;

	@Transactional(readOnly=true)
	public UsuarioSistemaBean validarAccesoSistema(String usuario, String clave) {

		UsuarioSistemaBD usuarioBd = usuarioDao.obtenerUsuarioPorNombre(usuario);
		
		UsuarioSistemaBean usuarioSistema = new UsuarioSistemaBean();

		if(usuarioBd!=null){

			usuarioSistema.setUsuarioExiste(true);
			
			if(usuarioBd.getClave().equals(clave)){
				usuarioSistema.setLoginCorrecto(true);
				usuarioSistema.setUsuarioBd(usuarioBd);

			}else{
				usuarioSistema.setLoginCorrecto(false);
			}
			
		}else{
			usuarioSistema.setUsuarioExiste(false);
		}

		return usuarioSistema;
	}
	
	@Transactional(readOnly=true)
	public List<ModuloPanelBean> cargarModulosPorUsuario(UsuarioSistemaBean usuarioSistemaBean,String rutaRaiz){
		
		List<ModuloPanelBean> lstModulosPanelPrincipal = new ArrayList<ModuloPanelBean>();
		
		//Obtener los permisos del usuario
		UsuarioSistemaBD usuarioBd = usuarioDao.obtenerUsuarioPorNombre(usuarioSistemaBean.getUsuarioBd().getUsuario());
		List<ModuloBD> lstModulos = new ArrayList<ModuloBD>();
		cargarListadoModulos(usuarioBd,lstModulos);
		
		for(ModuloBD modulo:lstModulos){
			
			if(modulo.getUrlImagen()!=null){
				Set<PaginaBD> stPaginas = modulo.getStPaginas();

				ModuloPanelBean moduloPanel = null;
				//Se cargara la primera pagina registrada por modulo que tenga fotografia
				if(stPaginas!=null && stPaginas.size()>0){

					for(PaginaBD pagina:stPaginas){
						if(pagina.getVisual().equals(Constantes.PAGINA_ACTIVADA)){
							moduloPanel = new ModuloPanelBean();
							moduloPanel.setNombreModulo(modulo.getNombre());
							moduloPanel.setRutaImagen(modulo.getUrlImagen());
							moduloPanel.setRutaPagina(rutaRaiz + "/" + pagina.getUrl());
						}
					}
				}
				
				if(moduloPanel!=null){
					lstModulosPanelPrincipal.add(moduloPanel);
				}
			}
		}
		
		return lstModulosPanelPrincipal;
	}

	@Transactional(readOnly=true)
	public void cargarMenuPorUsuario(UsuarioSistemaBean usuarioSistemaBean,List<Object> lstItemsMenu,String rutaRaiz) {
		
		//Obtener los permisos del usuario
		UsuarioSistemaBD usuarioBd = usuarioDao.obtenerUsuarioPorNombre(usuarioSistemaBean.getUsuarioBd().getUsuario());
		List<ModuloBD> lstModulos = new ArrayList<ModuloBD>();
		cargarListadoModulos(usuarioBd,lstModulos);

		usuarioSistemaBean.setLstModulosAutorizados(lstModulos);
		
		for(ModuloBD modulo:lstModulos){
			
			if(modulo.getModuloPadre() == null){
				Object objMenu = crearMenuPorModulo(rutaRaiz,modulo);
				
				if(objMenu!=null){
					lstItemsMenu.add(objMenu);
				}
			}
		}
		
	}
	
	private Object crearMenuPorModulo(String rutaRaiz,ModuloBD modulo){

		SubMenuBean submenu = null;
		MenuItemBean item = null;

		Set<PaginaBD> stPaginas = modulo.getStPaginas();
		Set<ModuloBD> stSubModulos = modulo.getStModulos();
		
		//Crear los enlaces solo para paginas
		
		int contadorPaginasActivas = 0;
		int contadorSubMenusActivos = 0;
		
		if(stPaginas!=null){
			if(stPaginas.size() == 1){
				
				for(PaginaBD pagina:stPaginas){
					//1 pagina y hay submodulos
					if(stSubModulos!=null && stSubModulos.size()>0){
						submenu = new SubMenuBean();  
				        submenu.setLabel(modulo.getNombre());
				        
				        if(pagina.getVisual().equals(Constantes.PAGINA_ACTIVADA)){
				        	 MenuItemBean menuItem = new MenuItemBean();
				        	 menuItem.setLabel(pagina.getNombre());  
				        	 menuItem.setUrl(rutaRaiz + "/" + pagina.getUrl());
				        	 submenu.agregarMenuItem(menuItem);
				        }
				       
					}else{
						//1 pagina y no tiene submodulos entonces solo se crea un enlace
						if(pagina.getVisual().equals(Constantes.PAGINA_ACTIVADA)){
							item = new MenuItemBean();
							item.setLabel(modulo.getNombre());  
				        	item.setUrl(rutaRaiz + "/" + pagina.getUrl());
						}
					}
				}
			}else{
				if(stPaginas.size() > 1){
					submenu = new SubMenuBean();  
			        submenu.setLabel(modulo.getNombre());
			        
					for(PaginaBD pagina:stPaginas){
						if(pagina.getVisual().equals(Constantes.PAGINA_ACTIVADA)){
							MenuItemBean menuItem = new MenuItemBean();  
							menuItem.setLabel(pagina.getNombre());  
							menuItem.setUrl(rutaRaiz + "/" + pagina.getUrl());
				        	submenu.agregarMenuItem(menuItem);
				        	contadorPaginasActivas++;
						}
					}
					
					if(contadorPaginasActivas == 0){
						submenu = null;
					}
				}
			}
		}
		
		//Crear menu para los submodulos
		if(stSubModulos!=null && stSubModulos.size()>0){
			if(submenu == null){
				submenu = new SubMenuBean();
		        submenu.setLabel(modulo.getNombre());
			}

	        for(ModuloBD subModulo:stSubModulos){
	        	Object objMenu = crearMenuPorModulo(rutaRaiz,subModulo);
	        	if(objMenu!=null){
	        		if(objMenu instanceof SubMenuBean){
	        			SubMenuBean sm = (SubMenuBean)objMenu;
		        		submenu.agregarMenuItem(sm);
		        	}
		        	
		        	if(objMenu instanceof MenuItemBean){
		        		MenuItemBean mt = (MenuItemBean)objMenu;
		        		submenu.agregarMenuItem(mt);
		        	}
		        	contadorSubMenusActivos++;
	        	}
	        }
		}

        if(contadorPaginasActivas==0 && contadorSubMenusActivos==0){
        	submenu = null;
        }

		if(item!=null){
			return item;
		}else{
			return submenu;
		}
	}
	
	private void cargarListadoModulos(UsuarioSistemaBD usuarioBd,List<ModuloBD> lstModulos){
		Set<PermisoBD> stPermisos = null;

		//Obtener los permisos por modulo
		stPermisos = usuarioBd.getStPermisos();
				
		if(stPermisos!=null){
			for(PermisoBD permiso:stPermisos){
				Set<ModuloBD> stModulos = permiso.getStModulos();
			
				//Si un modulo ya esta en el listado no se debe agregar otra vez
				if(stModulos!=null){
					for(ModuloBD modulo:stModulos){
						int i = 0;
						int dim = lstModulos.size();
						boolean encontrado = false;
						while(i<dim && !encontrado){
							ModuloBD moduloExistente = lstModulos.get(i);
							if(moduloExistente.getId().equals(modulo.getId())){
								encontrado = true;
							}
							i = i + 1;
						}

						if(!encontrado){
							lstModulos.add(modulo);
						}
					}
				}	
			}
		}
	}

}